package com.ruoyi.learn.java.thread;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

public class BoundedLinkedQueueExample {
    public static void main(String[] args) throws InterruptedException {
        // 创建容量为 2 的有界 LinkedBlockingQueue
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(2);

        queue.put("A");
        queue.put("B");
        System.out.println("队列已添加 2 个元素");

        // 此时队列已满，put 操作会阻塞，直到有元素被取出
        new Thread(() -> {
            try {
                Thread.sleep(1000); // 模拟延迟
                queue.take(); // 取出一个元素，释放队列空间
                System.out.println("取出一个元素，队列不再满");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        queue.put("C"); // 等待队列有空间后才会执行
        System.out.println("成功添加第三个元素：C");

    }

    // put take  offer  poll
    public static void test1(){
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(2);
        // put()：队列满时阻塞
        try {
            queue.put("A"); // 成功
            queue.put("B"); // 成功（队列满）
            queue.put("C"); // 阻塞，直到有元素被取出
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt(); // 处理中断
        }

// offer()：队列满时返回false
        System.out.println(queue.offer("A")); // true
        System.out.println(queue.offer("B")); // true
        System.out.println(queue.offer("C")); // false（添加失败）

// offer(超时)：等待3秒后仍满则返回false
        try {
            boolean success = queue.offer("C", 3, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }


        // take()：队列为空时阻塞
        try {
            String a = queue.take(); // 取出"A"
            String b = queue.take(); // 取出"B"
            String c = queue.take(); // 阻塞，直到有新元素添加
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

// poll()：队列为空时返回null
        System.out.println(queue.poll()); // "A"（若队列非空）
        System.out.println(queue.poll()); // "B"
        System.out.println(queue.poll()); // null（队列空）

// poll(超时)：等待3秒后仍空则返回null
        try {
            String c = queue.poll(3, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}